/*
 * To convertir this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ort.workshopTDD.money;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;

/**
 *
 * @author madrax
 */
public class Dinero {
  
  private BigDecimal  cantidad;
  private String moneda;

  @Override
  public String toString() {
    return this.getMoneda() + " " + String.valueOf(this.getCantidad());
  }

  @Override
  public boolean equals(Object obj) {
   if (this == obj)
     return true;
   if (obj == null)
     return false;
   if (!(obj instanceof Dinero))
      return false;
    Dinero otraMoneda = (Dinero) obj;
    if (getCantidad().compareTo(otraMoneda.getCantidad()) != 0)
      return false;
    if (getMoneda() == null) {
      if (otraMoneda.getMoneda() != null)
        return false;
    } 
    else if (!getMoneda().equals(otraMoneda.getMoneda()))
      return false;
    return true;
  }

  @Override
  public int hashCode() {
    int hash = 3;
    hash = 43 * hash + (this.getCantidad() != null ? this.getCantidad().hashCode() : 0);
    hash = 43 * hash + (this.getMoneda() != null ? this.getMoneda().hashCode() : 0);
    return hash;
  }

  public Dinero(BigDecimal cantidad, String moneda) {
    this.cantidad = cantidad;
    this.moneda = moneda;
    
  }

  public BigDecimal getCantidad() {
    return cantidad;
  }

  public void setCantidad(BigDecimal cantidad) {
    this.cantidad = cantidad;
  }

  public String getMoneda() {
    return moneda;
  }


  public Dinero sumar(Dinero cantidadAAgregar) {
    this.setCantidad(this.getCantidad().add(cantidadAAgregar.getCantidad()));
    return this;
  }

  public Dinero sumar(Dinero monedaASumar, TasaDeCambio tasaDeCambio) throws Exception {
    if (monedaASumar.getMoneda().equals(this.getMoneda())) {
      this.cantidad = this.cantidad.add(monedaASumar.getCantidad());
    }
    else {
      Dinero monedaConvertida = null;
      monedaConvertida = tasaDeCambio.convertir(monedaASumar);
      if (!monedaConvertida.getMoneda().equals(this.getMoneda())) {
        throw new Exception ("No puedo restar dos monedas diferentes con los cambios dados");
      }
      this.cantidad = this.cantidad.add(monedaConvertida.getCantidad());
    }
    return this;
  }

  public Dinero restar(Dinero cantidadARestar) {
    this.setCantidad(this.getCantidad().subtract(cantidadARestar.getCantidad()));
    return this;
  }

  public Dinero restar(Dinero monedaARestar, TasaDeCambio tasaDeCambio) throws Exception {
    if (monedaARestar.moneda.equals(this.moneda)) {
      this.cantidad = this.cantidad.subtract(monedaARestar.getCantidad());
    }
    else {
      Dinero monedaConvertida = null;
      monedaConvertida = tasaDeCambio.convertir(monedaARestar);
      if (!monedaConvertida.getMoneda().equals(this.getMoneda())) {
        throw new Exception ("No puedo restar dos monedas diferentes con los cambios dados");
      }
      this.cantidad = this.cantidad.subtract(monedaConvertida.getCantidad());      
    }
    return this;
  }

  public Dinero dividir(BigDecimal divisor) throws Exception {
    if (divisor.compareTo(new BigDecimal(BigInteger.ZERO))==0) {
      throw new Exception("Imposible dividir por cero");
    }
    else {
      this.cantidad = this.cantidad.divide(divisor, MathContext.DECIMAL32);
    }
    return this;
  }

  public Dinero multiplicar(BigDecimal multiplicador) throws Exception {
    this.cantidad = this.getCantidad().multiply(multiplicador, MathContext.DECIMAL32);
    return this;
  }

  public Dinero porciento(Double porcentaje) {
    porcentaje = porcentaje/100;
    this.cantidad = this.getCantidad().multiply(new BigDecimal(porcentaje), MathContext.DECIMAL32);
    return this;
  }

  public Dinero porcientoMas(Double porcentaje) {
    porcentaje = (100+porcentaje)/100;
    this.cantidad = this.getCantidad().multiply(new BigDecimal(porcentaje), MathContext.DECIMAL32);
    return this;
  }

  public Dinero porcientoMenos(Double porcentaje) {
    porcentaje = (100-porcentaje)/100;
    this.cantidad = this.getCantidad().multiply(new BigDecimal(porcentaje), MathContext.DECIMAL32);
    return this;
  }

}
